﻿using EightOData.Model;
using System;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Navigation;

namespace EightOData
{
    /// <summary>
    /// La page de création de liste de cadeaux.
    /// </summary>
    public sealed partial class WishListEditionPage
    {
        #region Properties

        private const String DEFAULT_NAME = "Entrez un nouveau nom";
        private Uri _imagePath;
        private WishList _currentWishList;

        #endregion

        #region Constructor

        /// <summary>
        /// Initialisation d'une page de type WishListEditionPage.
        /// </summary>
        public WishListEditionPage()
        {
            InitializeComponent();
            Title.Text = DEFAULT_NAME;
        }

        #endregion

        #region Events

        /// <summary>
        /// Permet à l'utilisateur de choisir une image et de l'afficher.
        /// </summary>
        private async void PickImage_Tapped(object sender, TappedRoutedEventArgs e)
        {
            var openPicker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary };
            openPicker.FileTypeFilter.Add(".jpg");
            openPicker.FileTypeFilter.Add(".jpeg");
            openPicker.FileTypeFilter.Add(".png");
            var file = await openPicker.PickSingleFileAsync();

            // Si le fichier est null, alors l'utilisateur a annulé la recherche, ou l'application a été quittée
            if (file != null)
            {
                // Ouverture du fichier en mode lecture
                using (var stream = await file.OpenAsync(FileAccessMode.Read))
                {
                    var image = new BitmapImage();
                    await image.SetSourceAsync(stream);
                    Image.Source = image;
                }

                // Sauvegarde du chemin
                var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Images", CreationCollisionOption.OpenIfExists);
                var copy = await file.CopyAsync(folder, file.Name, NameCollisionOption.GenerateUniqueName);
                _imagePath = new Uri(copy.Path, UriKind.RelativeOrAbsolute);
            }
        }

        /// <summary>
        /// Crée une liste de cadeaux si le formulaire a été correctement rempli, sinon, affiche un message d'erreur.
        /// </summary>
        private async void Validate_Tapped(object sender, TappedRoutedEventArgs e)
        {
            if (String.IsNullOrWhiteSpace(Title.Text) || Title.Text == DEFAULT_NAME)
            {
                await (new MessageDialog("Le formulaire n'a pas été correctement rempli !")).ShowAsync();
            }
            else if (_currentWishList == null)
            {
                // Si le contenu du formulaire est valide, création de la liste de cadeaux
                Frame.Navigate(typeof(WishListPage),
                    new WishList
                    {
                        Name = Title.Text,
                        StartDate = DateTime.Today,
                        IsActive = true,
                        Owner = new User { FirstName = "Test", Surname = "Owner", Email = "owner.test@live.com" },
                        Image = _imagePath
                    });
            }
            else
            {
                // Si le contenu du formulaire est valide, création de la liste de cadeaux
                _currentWishList.Name = Title.Text;
                _currentWishList.Image = _imagePath;
                Frame.Navigate(typeof(WishListPage));
            }
        }

        /// <summary>
        /// Effectue la navigation vers la page précédente.
        /// </summary>
        private void BackButton_Tapped(object sender, TappedRoutedEventArgs e)
        {
            Frame.Navigate(typeof(WishListPage));
        }

        /// <summary>
        /// Efface le texte par défaut si l'utilisateur n'a rien entré.
        /// </summary>
        private void Name_GotFocus(object sender, RoutedEventArgs e)
        {
            Title.Text = Title.Text == DEFAULT_NAME ? String.Empty : Title.Text;
        }

        /// <summary>
        /// Affiche un texte par défaut si l'utilisateur n'a rien entré.
        /// </summary>
        private void Name_LostFocus(object sender, RoutedEventArgs e)
        {
            Title.Text = String.IsNullOrWhiteSpace(Title.Text) ? DEFAULT_NAME : Title.Text;
        }

        /// <summary>
        /// A l'arrivée sur la page, charge les données de la liste de cadeaux passée en paramètre.
        /// </summary>
        /// <param name="e">Paramètres de navigation</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            _currentWishList = null;

            if (e.Parameter != null && e.Parameter is WishList)
            {
                var wishList = e.Parameter as WishList;
                _currentWishList = wishList;
                Title.Text = wishList.Name;

                // Affichage de l'image
                var image = new BitmapImage();
                image.UriSource = wishList.Image;
                Image.Source = image;
            }
        }

        #endregion
    }
}
